package cn.sxt.logistics.mapper;

import cn.sxt.logistics.pojo.User;
import cn.sxt.logistics.pojo.UserExample.Criteria;
import cn.sxt.logistics.pojo.UserExample.Criterion;
import cn.sxt.logistics.pojo.UserExample;
import java.util.List;
import org.apache.ibatis.jdbc.SQL;

public class UserSqlProvider {

	public String deleteByExample(UserExample example) {
		SQL sql = new SQL();
		sql.DELETE_FROM("t_user");
		applyWhere(sql, example, false);
		return sql.toString();
	}

	public String insertSelective(User record) {
		SQL sql = new SQL();
		sql.INSERT_INTO("t_user");

		if (record.getUserId() != null) {
			sql.VALUES("user_id", "#{userId,jdbcType=BIGINT}");
		}

		if (record.getUsername() != null) {
			sql.VALUES("username", "#{username,jdbcType=VARCHAR}");
		}

		if (record.getRealname() != null) {
			sql.VALUES("realname", "#{realname,jdbcType=VARCHAR}");
		}

		if (record.getPassword() != null) {
			sql.VALUES("password", "#{password,jdbcType=VARCHAR}");
		}

		if (record.getSalt() != null) {
			sql.VALUES("salt", "#{salt,jdbcType=VARCHAR}");
		}

		if (record.getStatus() != null) {
			sql.VALUES("status", "#{status,jdbcType=INTEGER}");
		}

		if (record.getCreateDate() != null) {
			sql.VALUES("create_date", "#{createDate,jdbcType=DATE}");
		}

		if (record.getRoleId() != null) {
			sql.VALUES("role_id", "#{roleId,jdbcType=BIGINT}");
		}

		return sql.toString();
	}

	public String selectByExample(UserExample example) {
		SQL sql = new SQL();

		sql.SELECT("t_user.*");
		sql.SELECT("t_role.rolename,t_role.permission_ids permissionIds");
		sql.FROM("t_user left join t_role on t_user.role_id = t_role.role_id");

		applyWhere(sql, example, false);

		if (example != null && example.getOrderByClause() != null) {
			sql.ORDER_BY(example.getOrderByClause());
		}

		return sql.toString();
	}

	public String updateByPrimaryKeySelective(User record) {
		SQL sql = new SQL();
		sql.UPDATE("t_user");

		if (record.getUsername() != null) {
			sql.SET("username = #{username,jdbcType=VARCHAR}");
		}

		if (record.getRealname() != null) {
			sql.SET("realname = #{realname,jdbcType=VARCHAR}");
		}

		if (record.getPassword() != null) {
			sql.SET("password = #{password,jdbcType=VARCHAR}");
		}

		if (record.getSalt() != null) {
			sql.SET("salt = #{salt,jdbcType=VARCHAR}");
		}

		if (record.getStatus() != null) {
			sql.SET("status = #{status,jdbcType=INTEGER}");
		}

		if (record.getCreateDate() != null) {
			sql.SET("create_date = #{createDate,jdbcType=DATE}");
		}

		if (record.getRoleId() != null) {
			sql.SET("role_id = #{roleId,jdbcType=BIGINT}");
		}

		sql.WHERE("user_id = #{userId,jdbcType=BIGINT}");

		return sql.toString();
	}

	protected void applyWhere(SQL sql, UserExample example, boolean includeExamplePhrase) {
		if (example == null) {
			return;
		}

		String parmPhrase1;
		String parmPhrase1_th;
		String parmPhrase2;
		String parmPhrase2_th;
		String parmPhrase3;
		String parmPhrase3_th;
		if (includeExamplePhrase) {
			parmPhrase1 = "%s #{example.oredCriteria[%d].allCriteria[%d].value}";
			parmPhrase1_th = "%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}";
			parmPhrase2 = "%s #{example.oredCriteria[%d].allCriteria[%d].value} and #{example.oredCriteria[%d].criteria[%d].secondValue}";
			parmPhrase2_th = "%s #{example.oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{example.oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}";
			parmPhrase3 = "#{example.oredCriteria[%d].allCriteria[%d].value[%d]}";
			parmPhrase3_th = "#{example.oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}";
		} else {
			parmPhrase1 = "%s #{oredCriteria[%d].allCriteria[%d].value}";
			parmPhrase1_th = "%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s}";
			parmPhrase2 = "%s #{oredCriteria[%d].allCriteria[%d].value} and #{oredCriteria[%d].criteria[%d].secondValue}";
			parmPhrase2_th = "%s #{oredCriteria[%d].allCriteria[%d].value,typeHandler=%s} and #{oredCriteria[%d].criteria[%d].secondValue,typeHandler=%s}";
			parmPhrase3 = "#{oredCriteria[%d].allCriteria[%d].value[%d]}";
			parmPhrase3_th = "#{oredCriteria[%d].allCriteria[%d].value[%d],typeHandler=%s}";
		}

		StringBuilder sb = new StringBuilder();
		List<Criteria> oredCriteria = example.getOredCriteria();
		boolean firstCriteria = true;
		for (int i = 0; i < oredCriteria.size(); i++) {
			Criteria criteria = oredCriteria.get(i);
			if (criteria.isValid()) {
				if (firstCriteria) {
					firstCriteria = false;
				} else {
					sb.append(" or ");
				}

				sb.append('(');
				List<Criterion> criterions = criteria.getAllCriteria();
				boolean firstCriterion = true;
				for (int j = 0; j < criterions.size(); j++) {
					Criterion criterion = criterions.get(j);
					if (firstCriterion) {
						firstCriterion = false;
					} else {
						sb.append(" and ");
					}

					if (criterion.isNoValue()) {
						sb.append(criterion.getCondition());
					} else if (criterion.isSingleValue()) {
						if (criterion.getTypeHandler() == null) {
							sb.append(String.format(parmPhrase1, criterion.getCondition(), i, j));
						} else {
							sb.append(String.format(parmPhrase1_th, criterion.getCondition(), i, j,
									criterion.getTypeHandler()));
						}
					} else if (criterion.isBetweenValue()) {
						if (criterion.getTypeHandler() == null) {
							sb.append(String.format(parmPhrase2, criterion.getCondition(), i, j, i, j));
						} else {
							sb.append(String.format(parmPhrase2_th, criterion.getCondition(), i, j,
									criterion.getTypeHandler(), i, j, criterion.getTypeHandler()));
						}
					} else if (criterion.isListValue()) {
						sb.append(criterion.getCondition());
						sb.append(" (");
						List<?> listItems = (List<?>) criterion.getValue();
						boolean comma = false;
						for (int k = 0; k < listItems.size(); k++) {
							if (comma) {
								sb.append(", ");
							} else {
								comma = true;
							}
							if (criterion.getTypeHandler() == null) {
								sb.append(String.format(parmPhrase3, i, j, k));
							} else {
								sb.append(String.format(parmPhrase3_th, i, j, k, criterion.getTypeHandler()));
							}
						}
						sb.append(')');
					}
				}
				sb.append(')');
			}
		}

		if (sb.length() > 0) {
			sql.WHERE(sb.toString());
		}
	}
}